
package alarmdisplay;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.io.UnsupportedEncodingException;
import java.util.*;
import java.util.Date;
import java.util.Properties;
 
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 
/**
 * @author zeja
 */
public class SendMail implements Runnable {
		private String sUsername = "";
		private String sPassword = "";
		private String sSenderAddress ="";
		private String sRecipientsAddress = ""; 
		private String sSubject = "";
		private String sSmtpHost = "";
		private String sAuth = "";
		private String sText = "";
		private String sSMSuser = "";
		private String sSMSpass = "";

		/**
		* Neue Anforderung:
		* eMails und SMS sollen parallel versendet werden.
		* Damit keine (wenig) Änderungen in den anderen Klassen notwendig sind, kapseln wir das ganze hier...
		*/
		public static void smsAndEMail(int iCheck, String sText) {
			Datenbank db = new Datenbank();
			Vector<String> v = new Vector<String>();
			
			// Ab hier werden die eMails versendet
			// -----------------------------------
			if (iCheck == -1) {
				v = db.dbQueryEMail("mail_recipient");
			} else {
				v = db.dbQueryEMail("mail_recipient_2");
			}
			for (int i=0; i < v.size(); i++) {
				String sSubject = "";
				if (iCheck == -1) {
					sSubject = "Alarm-EMail V1.40 Winsen Luhe";
				} else {
					sSubject = "Alarm-EMail V1.40 Lassroenne";
				}
				SendMail sm = new SendMail((String)v.elementAt(i), sText, sSubject, "", "");
				Thread t1 = new Thread(sm);
				t1.start();
			}

			// Ab hier werden hier SMS versendet
			// ---------------------------------
			String sSMSuserX = "";
			String sSMSpassX = "";
			if (iCheck == -1) {
				v = db.dbQuerySMS("sms_num");
				sSMSuserX = db.dbQueryConfig("sms_user");
				sSMSpassX = db.dbQueryConfig("sms_passwort");
			} else {
				v = db.dbQuerySMS("sms_num_2");
				sSMSuserX = db.dbQueryConfig("sms_user_2");
				sSMSpassX = db.dbQueryConfig("sms_passwort_2");
			}
			for(int i = 0; i < v.size(); i++) {
				if (sText.length() > 158) {
					sText = sText.substring(0, 158);
				}
				SendMail sm = new SendMail((String)v.elementAt(i), sText, "", sSMSuserX, sSMSpassX);
				Thread t1 = new Thread(sm);
				t1.start();
			}
		}
		
		/**
		* Konstruktor zum initialen Setzen der Verbindungsdaten
		*/
		public SendMail(String address, String text, String subject, String smsUser, String smsPass) {
			Debug.debug("SENDMAIL", "DEBUG Create:>> " + address + "/" + text + "/" + subject + "/" + smsUser + "/" + "---");
			this.sRecipientsAddress = address;
			this.sText = text;
			this.sSubject = subject;
			this.sSMSuser = smsUser;
			this.sSMSpass = smsPass;
		}


		/**
		* Fuer alles einen eigenen Thread erstellen
		*/
		public void run() {
			Debug.debug("SENDMAIL", "DEBUG Thread>> " + sRecipientsAddress + "/" + sText + "/" + sSubject + "/" + sSMSuser + "/" + "---");
			if (sSMSuser.equals("")) {
				sendMail(sRecipientsAddress, sSubject, sText);
			} else {
				sendSMS(sText, sRecipientsAddress, sSMSuser, sSMSpass);	
			}
		}
	
		public void sendMail(String recipientsAddress, String subject, String text) {
			Datenbank db = new Datenbank();
			sSmtpHost = db.dbQueryConfig("mail_server");
			sUsername = db.dbQueryConfig("mail_server_user");
			sPassword = db.dbQueryConfig("mail_server_pw");
			sAuth = db.dbQueryConfig("mail_server_auth");
			sSenderAddress = db.dbQueryConfig("mail_server_sender");
	
			Debug.debug("SENDMAIL", "DEBUG>> sendMail() sendeNachricht an " + recipientsAddress);
	        MailAuthenticator auth = new MailAuthenticator(sUsername, sPassword);
 
	        Properties properties = new Properties();
 
	        properties.put("mail.smtp.host", sSmtpHost);
	        properties.put("mail.smtp.auth", sAuth);
 
            properties.put("mail.smtp.socketFactory.port", "465");
            properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            properties.put("mail.smtp.port", "465");

 
	        // Hier wird mit den Properties und dem implements Contructor
	        // erzeugten
	        // MailAuthenticator eine Session erzeugt
	        Session session = Session.getDefaultInstance(properties, auth);
 
        	try {
	            // Eine neue Message erzeugen
	            Message msg = new MimeMessage(session);
	 
	            // Hier werden die Absender- und Empfaengeradressen gesetzt
	            msg.setFrom(new InternetAddress(sSenderAddress));
	            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientsAddress, false));
 
	            // Der Betreff und Body der Message werden gesetzt
	            msg.setSubject(subject);
	            msg.setText(text);
 
	            // Hier lassen sich HEADER-Informationen hinzufügen
	            msg.setHeader("Test", "Test");
	            msg.setSentDate(new Date());
 
	            // Zum Schluss wird die Mail natürlich noch verschickt
	            Transport.send(msg);
	        } catch (Exception err) {
			Debug.debug("SENDMAIL", "ERROR>> " + err);
		}
	}
    
	class MailAuthenticator extends Authenticator {
 	        /**
	         * Ein String, der den Usernamen nach der Erzeugung eines
	         * Objektes<br>
	         * dieser Klasse enthalten wird.
	         */
	        private final String user;
 
	        /**
	         * Ein String, der das Passwort nach der Erzeugung eines
	         * Objektes<br>
	         * dieser Klasse enthalten wird.
	         */
	        private final String password;
 
	        /**
	         * Der Konstruktor erzeugt ein MailAuthenticator Objekt<br>
	         * aus den beiden Parametern user und passwort.
	         * 
	         * @param user
	         *            String, der Username fuer den Mailaccount.
	         * @param password
	         *            String, das Passwort fuer den Mailaccount.
	         */
	        public MailAuthenticator(String user, String password) {
	            this.user = user;
	            this.password = password;
	        }
 
	        /**
	         * Diese Methode gibt ein neues PasswortAuthentication
	         * Objekt zurueck.
	         * 
	         * @see javax.mail.Authenticator#getPasswordAuthentication()
	         */
	        protected PasswordAuthentication getPasswordAuthentication() {
	            return new PasswordAuthentication(this.user, this.password);
	        }
	}

	/**
	*
	*/
	public void smsVersenden(int iCheck, String sText) {
		Datenbank db = new Datenbank();
		String sSMSuser = "";
		String sSMSpass = "";
		Vector<String> v = new Vector<String>();
		if (iCheck == -1) {
			v = db.dbQuerySMS("sms_num");
			sSMSuser = db.dbQueryConfig("sms_user");
			sSMSpass = db.dbQueryConfig("sms_passwort");
		} else {
			v = db.dbQuerySMS("sms_num_2");
			sSMSuser = db.dbQueryConfig("sms_user_2");
			sSMSpass = db.dbQueryConfig("sms_passwort_2");
		}
		for(int i = 0; i < v.size(); i++) {
			if (sText.length() > 158) {
				sText = sText.substring(0, 158);
			}
			sendSMS(sText, (String)v.elementAt(i), sSMSuser, sSMSpass);	
		}
	}
	
	/**
	* Eine SMS versenden
	*/
	public void sendSMS(String sText, String sPhone, String sSMSuser, String sSMSpass) {
		String sString = "";
		try {
			sString = "http://gateway.sms77.de/?u=" + sSMSuser + "&p=" + sSMSpass + "&to=" + sPhone + "&text=" + URLEncoder.encode(sText, "ISO-8859-1") + "&type=basicplus";
		} catch (UnsupportedEncodingException ex) {
			Debug.debug("SENDMAIL", "DEBUG>> Error: " + ex);
			return;
		}
		Debug.debug("SENDMAIL", "DEBUG>> sString fuer SMS: " + sString);
		try {
			URL url = new URL(sString);
			URLConnection conn = url.openConnection();
			BufferedReader URLinput = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			String line = "";
			while ((line = URLinput.readLine()) != null) {
				Debug.debug("SENDMAIL", "DEBUG>> read: " + line);
			}
		} catch (IOException ex) { 
			Debug.debug("SENDMAIL", "DEBUG>> Error: " + ex);
		}       
	}
}
